{"componentChunkName":"component---src-templates-post-tsx","path":"/date-02/","result":{"data":{"markdownRemark":{"html":"<p>  지난 포스팅을 통해 JS에서 날짜 및 시간 데이터를 전달할 문자열은 ISO 8601 형식에 맞춰 사용하기로 하였다. 이제 이 문자열을 데이터베이스에 저장하고자 한다. 하지만 MySQL에서 사용할 수 있는 날짜 및 시간 데이터의 저장 형식은 5가지나 될뿐더러 각 형식에서 사용할 수 있는 문자열의 형식과 ISO 8601의 형식이 다르기 때문에 그대로 사용하기 어렵다. ISO 8601 형식의 문자열에 적합한 저장 형식을 고려하면서 이번 기회에 항상 헷갈렸던 MySQL의 날짜 및 시간 데이터 저장방식을 정리해보았다. <span class='small-text'>**관계형 데이터베이스의 데이터를 다루기 위해서 데이터베이스 관리 시스템(DBMS)을 사용하는데 그 중, MySQL을 기준으로 설명한다.</span></p>\n<h1 id=\"mysql의-날짜-및-시간-데이터-형식-data-type\" style=\"position:relative;\"><a href=\"#mysql%EC%9D%98-%EB%82%A0%EC%A7%9C-%EB%B0%8F-%EC%8B%9C%EA%B0%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%98%95%EC%8B%9D-data-type\" aria-label=\"mysql의 날짜 및 시간 데이터 형식 data type permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>MySQL의 날짜 및 시간 데이터 형식 (Data Type)</h1>\n<p>  MySQL은 날짜 및 시간 데이터를 5가지의 형식으로 저장한다. 각 형식에 대한 차이와 사용 가능한 문자열을 설명하고자 한다. <span class='small-text'>(숫자를 통한 표현도 가능하지만 여기서는 문자열 형식에 집중하였다.)</span>기본 예제는 '2020-03-20 03:30:58'을 사용한다.</p>\n<h2 id=\"예제환경\" style=\"position:relative;\"><a href=\"#%EC%98%88%EC%A0%9C%ED%99%98%EA%B2%BD\" aria-label=\"예제환경 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>예제환경</h2>\n<p>  각 날짜 및 시간 데이터의 형식을 테스트하기 위해 각 형식의 컬럼을 가진 테이블을 생성하였다. 테이블의 DDL과 생성된 테이블의 컬럼을 아래에 제시하였다.</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">DROP</span> <span class=\"token keyword\">TABLE</span>  <span class=\"token keyword\">IF</span> <span class=\"token keyword\">EXISTS</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">CREATE</span> <span class=\"token keyword\">TABLE</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">`</span>mytimestamp<span class=\"token punctuation\">`</span> <span class=\"token keyword\">timestamp</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">`</span>mydate<span class=\"token punctuation\">`</span> <span class=\"token keyword\">date</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">`</span>mytime<span class=\"token punctuation\">`</span> <span class=\"token keyword\">time</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">`</span>mydatetime<span class=\"token punctuation\">`</span> <span class=\"token keyword\">datetime</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">`</span>myyear<span class=\"token punctuation\">`</span> <span class=\"token keyword\">year</span>\n<span class=\"token punctuation\">)</span> <span class=\"token keyword\">ENGINE</span><span class=\"token operator\">=</span><span class=\"token keyword\">InnoDB</span> <span class=\"token keyword\">DEFAULT</span> <span class=\"token keyword\">CHARSET</span><span class=\"token operator\">=</span>utf8mb4 <span class=\"token keyword\">COLLATE</span><span class=\"token operator\">=</span>utf8mb4_general_ci<span class=\"token punctuation\">;</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 237px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/a15e2864e4910a057c8be7ebf7c769fd/008e2/date_table.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 47.972972972972975%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAABqElEQVQoz3VSa2+iUBDl//+R/dL00ybVZm211kcBRaAXEfARQQWadptVUYt6OnNbjV3bSU7ucO/McE7OKLqmwvN8cOx2O+z3ewnOOaIoguu6mEwmGAwGGA6HyPNcvnHd/6E0dAPxbPZlyGnwICEE0jTFaDRCr9c71m632zMoF2YK0WmhVq9D0zQ0Gg2USiVUKhX5HQQBTNOESrmqqqhTXbPZ/JGl8tuM4LsCNrGwLAs+DUjSBEmS0plKia12+/M+RRwnmMUxstUKq/X6DMqFPobV1nBfq+OuWoX9+IjN25tsyEmCcAT+EGPhOPKem9abDRbZEovlOZRLYwLPsWF0OrBtW0o8lRL4PgyjjfF4fJT1nRlHyQURY9T30HV78KiZpf2bz7GkvzHDMArhdLvo9/uSwTLLsCGGzPY7KL8ehtCbNdzclnFbLqNKsq8KBRSKRfx9fYVFrIvX11I2g/PnlxeSnGG+WJxBSg7IFGbHprAJHPn2w8XpdCrd5n2U9+TuYV93h509yZV7/4lcdiQTwzAQhqF8lI10slS91cKUdvUw8LBz+SdO83f9Heg/src5GAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"date table\"\n        title=\"date table\"\n        src=\"/static/a15e2864e4910a057c8be7ebf7c769fd/008e2/date_table.png\"\n        srcset=\"/static/a15e2864e4910a057c8be7ebf7c769fd/12f09/date_table.png 148w,\n/static/a15e2864e4910a057c8be7ebf7c769fd/008e2/date_table.png 237w\"\n        sizes=\"(max-width: 237px) 100vw, 237px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<br/>\n<h2 id=\"date\" style=\"position:relative;\"><a href=\"#date\" aria-label=\"date permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>DATE</h2>\n<hr>\n<p>  날짜 정보를 저장한다. 사용 가능한 형식은 두 가지이다. 반드시 날짜의 의미를 가진 숫자를 사용해야 한다. </p>\n<h3 id=\"1-yyyy-mm-dd-의-형식\" style=\"position:relative;\"><a href=\"#1-yyyy-mm-dd-%EC%9D%98-%ED%98%95%EC%8B%9D\" aria-label=\"1 yyyy mm dd 의 형식 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. 'YYYY-MM-DD' 의 형식</h3>\n<p>구분자를 사용한 년 - 월 - 일 데이터 형식이다. 아래와 같은 특징을 가진다. </p>\n<ul>\n<li><strong>구분자 '-'에 대신 다른 특수 문자로 대체가 가능하다.</strong><br>\n</br></li>\n<li>\n<p><strong>년 / 월 / 일의 숫자 모두 날짜의 의미를 지니는 숫자여야 한다. 각각의 유효 범위는 아래와 같다.</strong>  </p>\n<p><strong><em>(년 / 월 / 일 모두 0은 포함되지 않는다.)</em></strong></p>\n<ul>\n<li>'YYYY'의 유효 범위는 [0001, 9999]</li>\n<li>'MM'의 유효 범위는 [01, 12]</li>\n<li>'DD'의 유효 범위는 [01, 31]</li>\n</ul>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\"># OK!</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydate<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2020-03-20'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># OK!</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydate<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2020%03%21'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydate<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2021~03~22'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># Incorrect date value: '2020-03-32' for column 'mydate' at row 1</span>\n<span class=\"token comment\"># 32일은 날짜의 의미를 가지지 못한다.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydate<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2020-03-32'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># Incorrect date value: '2020-13-01' for column 'mydate' at row 1</span>\n<span class=\"token comment\"># 13월은 날짜의 의미를 가지지 못한다.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydate<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2020-13-01'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">#Incorrect date value: '2020-01-00' for column 'mydate' at row 1</span>\n<span class=\"token comment\"># 년 / 월 / 일 모두 0은 사용이 불가능하다.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydate<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2020-01-00'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<br/>\n<h3 id=\"2-구분자가-생략된-yyyymmdd-형식\" style=\"position:relative;\"><a href=\"#2-%EA%B5%AC%EB%B6%84%EC%9E%90%EA%B0%80-%EC%83%9D%EB%9E%B5%EB%90%9C-yyyymmdd-%ED%98%95%EC%8B%9D\" aria-label=\"2 구분자가 생략된 yyyymmdd 형식 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. 구분자가 생략된 'YYYYMMDD' 형식</h3>\n<p>위의 형식에서 구분자가 생략된 형식이다. 구분자를 사용하지 않기 때문에 문자열의 길이를 줄일 수 있으나 자릿 수에 따라 시간적 의미가 달라질 수 있으므로 주의하여야 한다.</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\"># OK!</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydate<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'20210320'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># Incorrect date value: '20201301' for column 'mydate' at row 1</span>\n<span class=\"token comment\"># 13월은 날짜의 의미를 가지지 못한다.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydate<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'20201301'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 2069-03-20이 저장된다.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydate<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'690320'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 1970-03-20이 저장된다.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydate<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'700320'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li><strong>네 자리 표현 'YYYY'으로 사용된 년도를 두 자리 표현 'YY' 이 사용 가능하다</strong><br>\n두 자리 표현은 표현 범위의 제약으로 필자는 사용하지 않는다. 사용하려면 <a href=\"https://dev.mysql.com/doc/refman/8.0/en/two-digit-years.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">표현 범위 제약 조건</a>에 대해 올바르게 이해하고 사용하자. </li>\n</ul>\n<br/>\n<br/>\n<br/>\n<h2 id=\"time\" style=\"position:relative;\"><a href=\"#time\" aria-label=\"time permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TIME</h2>\n<hr>\n<p>  시간 정보를 저장한다. 여러 가지 형식이 존재하지만, 기본적인 형식만 설명하고 이외의 형식은 예제로 소개만 하였다. DATE와 동일하게 반드시 시간의 의미를 가진 숫자를 사용해야 한다.</p>\n<h3 id=\"1-기본적인-시분초로-구성된-hhmmss-형식\" style=\"position:relative;\"><a href=\"#1-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EC%8B%9C%EB%B6%84%EC%B4%88%EB%A1%9C-%EA%B5%AC%EC%84%B1%EB%90%9C-hhmmss-%ED%98%95%EC%8B%9D\" aria-label=\"1 기본적인 시분초로 구성된 hhmmss 형식 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. 기본적인 시,분,초로 구성된 'hh:mm:ss' 형식</h3>\n<p>구분자를 사용한 시:분:초 데이터 형식이다. 아래와 같은 특징을 가진다. </p>\n<ul>\n<li>\n<p><strong>시 / 분 / 초 각각의 유효 범위는 아래와 같다.</strong></p>\n<ul>\n<li>'hh'의 유효 범위는 [00, 23]</li>\n<li>'mm'의 유효 범위는 [00, 60]</li>\n<li>'ss'의 유효 범위는 [00, 60]<br>\n</br></li>\n</ul>\n</li>\n<li><strong>기본 형식 'hh:mm:ss'에서 일의 수인 'D'를 추가하여 'D hh:mm:ss'를 사용할 수 있다.</strong><br>\n   'D'는 [0, 34] 사이의 값을 가지며, 1일당 24시간씩 더해져서 TIME 형식으로 저장된다.<br>\n위의 예제에서는 4일이므로 24*4인 96시간이 더해져 99시간으로 저장된다.<br>\n</br></li>\n<li><strong>부분 형식 또한 사용이 가능하다.</strong><br>\n그중 하나인 'hh:mm' 형식을 예제에서 확인할 수 있다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\"># 'hh:mm:ss' 형식, OK!</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'03:30:58'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># Incorrect time value: '03:60:58' for column 'mytime' at row 1</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'03:60:58'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 'D hh:mm:ss' 형식, OK! '99:30:58'의 값을 가짐.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'4 03:30:58'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 'hh:mm' 형식, OK! '03:30:00'의 값을 가짐.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'03:30'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<br/>\n<h3 id=\"2-구분자가-존재하지-않는-hhmmss-형식\" style=\"position:relative;\"><a href=\"#2-%EA%B5%AC%EB%B6%84%EC%9E%90%EA%B0%80-%EC%A1%B4%EC%9E%AC%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-hhmmss-%ED%98%95%EC%8B%9D\" aria-label=\"2 구분자가 존재하지 않는 hhmmss 형식 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. 구분자가 존재하지 않는 'hhmmss' 형식</h3>\n<ul>\n<li>예제에서처럼 구분자가 존재하지 않는 문자열의 경우, 자릿수가 증가할수록 인식하는 형식이 달라지기 때문에 주의하여야 한다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\"># 'hhmmss' 형식, OK! '03:30:58'의 값을 가짐.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'033058'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 'mmss' 형식, OK! '00:03:30'의 값을 가짐.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'0330'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 'ss' 형식, OK! '00:00:08'의 값을 가짐.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'8'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 'ss' 형식, Incorrect time value: '80' for column 'mytime' at row 1</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'80'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 'mmss' 형식, OK! '00:08:00'의 값을 가짐.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'800'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 'mmss' 형식, Incorrect time value: '8000' for column 'mytime' at row 1</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'8000'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 'hhmmss' 형식, OK! '08:00:00'의 값을 가짐.</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'80000'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li><span class='sub-text'>** TIME 형식의 경우, 정밀도를 위해 소수 초를 지원한다. 'hh:mm:ss.fraction' 의 형식으로 최대 6자리까지의 소수를 지원하며 소수 초을 사용하기 위해서는 TIME 형식을 선언할 때, DATE(6) 과 같이 자릿수를 명시한다.</span></li>\n</ul>\n<br/>\n<br/>\n<h2 id=\"datetime\" style=\"position:relative;\"><a href=\"#datetime\" aria-label=\"datetime permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>DATETIME</h2>\n<hr>\n<p>  날짜 및 시간 정보를 저장한다. 위의 DATE 형식과 TIME 형식을 함께 사용한 <code class=\"language-text\">&#39;&lt;DATE&gt;T&lt;TIME&gt;&#39;</code>의 형식을 사용한다. </p>\n<ul>\n<li><strong>날짜와 시간을 'T'를 통해 구분하며, 구분자 대신 공백을 사용할 수 있다. <code class=\"language-text\">&#39;&lt;DATE&gt; &lt;TIME&gt;&#39;</code></strong><br>\n</br></li>\n<li>\n<p><strong><code class=\"language-text\">&lt;DATE&gt;</code>는 위의 DATE 형식의 설명과, <code class=\"language-text\">&lt;TIME&gt;</code>는 위의 TIME 형식의 설명과 동일하다.</strong>  </p>\n<ol>\n<li>년 / 월 / 일 / 시 / 분 / 초 모두 각 날짜와 시간의 의미를 가지는 유효 범위 내에 존재하여야 한다.  </li>\n<li>'YYYY-MM-DD hh:mm:ss', 'YYYYMMDDhhmmss', 'YYYYMMDDThhmmss' 의 형식이 사용가 능하다. (하지만 'YYYYMMDD hhmmss' 의 형식은 불가능하다.)</li>\n<li>TIME 형식과 동일하게 소수 초를 지원하며 소수 초을 사용하기 위해서는 TIME 형식을 선언할 때, <code class=\"language-text\">DATETIME(6)</code>와 같이 자릿수를 명시한다.<br>\n<br/>   </li>\n</ol>\n</li>\n<li>\n<p><strong>오프셋의 명시가 가능하다.</strong>    </p>\n<p>  명시된 오프셋이 계산된 '2020-03-20 11:30:58'이 저장된다. TIMESTAMP 형식과 동일하게 시간대를 반영하여 저장되는데, 아래의 TIMESTAMP 형식의 설명을 통해 이해할 수 있다.<br>\n<br/></p>\n</li>\n<li><strong>위의 설명을 통해 DATETIME 형식에는 우리가 사용하고자 했던 '2020-03-20T03:30:58Z'은 삽입이 불가능하다는 것을 알 수 있다.</strong></li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\"># 'YYYY-MM-DDThh:mm:ss' 형식, '2020-03-20 03:30:58'</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydatetime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2020-03-20T03:30:58'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 'YYYY-MM-DD hh:mm:ss' 형식, '2020-03-20 03:30:58'</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydatetime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2020-03-20 03:30:58'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># ISO 8601 형식, Data truncation: Incorrect datetime value</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydatetime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2020-03-20T03:30:58Z'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 'YYYYMMDDThhmmss' 형식, '2020-03-20 03:30:58'</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydatetime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'20200320T033058'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 'YYYYMMDD hhmmss' 형식, '2020-03-20 03:30:58'</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydatetime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'20200320 033058'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># 오프셋 명시 형식,  '2020-03-20 11:30:58'</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mydatetime<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2020-03-20T03:30:58+01:00'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<br/>\n<br/>\n<h2 id=\"timestamp\" style=\"position:relative;\"><a href=\"#timestamp\" aria-label=\"timestamp permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>TIMESTAMP</h2>\n<hr>\n<p>  DATETIME과 동일하게 날짜 및 시간 정보를 저장하며 사용할 수 있는 문자열 형식 또한\n<code class=\"language-text\">&lt;DATE&gt;T&lt;TIME&gt;</code> ,  <code class=\"language-text\">&lt;DATE&gt; &lt;TIME&gt;</code>으로 동일하다. 하지만 중요한 <strong>두 가지 차이점</strong>이 존재한다.</p>\n<h3 id=\"1-시간-의미의-차이\" style=\"position:relative;\"><a href=\"#1-%EC%8B%9C%EA%B0%84-%EC%9D%98%EB%AF%B8%EC%9D%98-%EC%B0%A8%EC%9D%B4\" aria-label=\"1 시간 의미의 차이 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. 시간 의미의 차이</h3>\n<p>  전달되는 날짜 및 시간 문자열을 그대로 저장하는 DATETIME와 달리 TIMESTAMP 형식은 UTC 시간으로의 변환을 거친 뒤 저장한다. 이러한 변환 과정이 두 형식의 차이를 만드는데, 변환 과정을 '2020-03-20 03:30:58'로 예를 들어 설명한다.</p>\n<ol>\n<li>\n<p><strong>데이터베이스의 환경변수로 설정된 time_zone(시간대)을 통해 해당 지역의 오프셋을 정의한다.</strong>    </p>\n<ul>\n<li>\n<p>아래의 코드를 통해 현재 데이터베이스가 사용하는 시간대를 확인할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">SELECT</span> @<span class=\"token variable\">@time_zone</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// SYSTEM</span>\n<span class=\"token keyword\">SELECT</span> @<span class=\"token variable\">@system_time_zone</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">//KST</span></code></pre></div>\n</br>\n</li>\n<li><code class=\"language-text\">@@time_zone</code> 은 MySQL이 사용하는 시간대로, 'SYSYEM'의 값은 현재 시간대가 설정되지 않았으며, MySQL을 실행하는 OS의 시간대를 사용한다는 의미를 가진다. <code class=\"language-text\">SET @@time_zone = &#39;+1&#39;;</code> 와 같이 SET을 통해 특정 시간대를 설정할 수 있다.<br>\n<br/>  </li>\n<li><code class=\"language-text\">@@system_time_zone</code>은 MySQL을 실행하는 OS의 시간대를 의미한다.</li>\n</ul>\n<br/>      \n</li>\n<li>\n<p><strong>날짜 및 시간 데이터를 정의된 오프셋을 사용하여 UTC 시간으로 변환하여 저장한다.</strong>   </p>\n<p>  현재 데이터베이스가 사용하는 시간대가 'KST'이므로 오프셋은 '+9'이다.<br>\n내부적으로는 '2020-03-20 03:30:58'으로 저장하는 것이 아닌,<br>\n오프셋을 반대로 연산하여 변환된 UTC 시간인 '2020-03-19 18:30:58'UTC 로 저장된다.<br>\n<br/></p>\n</li>\n<li>\n<p><strong>조회 시에 현재 데이터베이스의 오프셋을 사용하여 UTC 시간으로 저장되어있는 날짜 및 시간 데이터를 지역 시간으로 바꿔 반환한다.</strong></p>\n<p>  TIMESTAMP 형식은 데이터 조회시마다 내부 변환 과정을 거친 데이터를 보여주기 때문에 일반적으로 DATETIME과 차이가 나지 않는다. 하지만 행 추가 시점과 조회 시점의 시간대가 변경되는 경우에 그 차이가 나타난다. 아래 코드의 결과를 통해 이해해보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">DELETE</span> <span class=\"token keyword\">FROM</span> type_test<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// SYSTEM = KST = '+09:00'</span>\n<span class=\"token keyword\">SELECT</span> @<span class=\"token variable\">@time_zone</span><span class=\"token punctuation\">;</span> \n\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> type_test<span class=\"token punctuation\">(</span>mydatetime<span class=\"token punctuation\">,</span> mytimestamp<span class=\"token punctuation\">)</span> \n<span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2020-03-20 03:30:58'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'2020-03-20 03:30:58'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">SELECT</span> mydatetime<span class=\"token punctuation\">,</span> mytimestamp <span class=\"token keyword\">FROM</span> type_test<span class=\"token punctuation\">;</span>\n<span class=\"token comment\"># +-------------------------------------------+</span>\n<span class=\"token comment\"># |      mydatetime     |      mytimestamp    |</span>\n<span class=\"token comment\"># |-------------------------------------------|</span>\n<span class=\"token comment\"># | 2020-03-20 03:30:58 | 2020-03-20 03:30:58 |</span>\n<span class=\"token comment\"># +-------------------------------------------+</span>\n\n<span class=\"token keyword\">SET</span> @<span class=\"token variable\">@time_zone</span> <span class=\"token operator\">=</span> <span class=\"token string\">'+01:00'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">SELECT</span> mydatetime<span class=\"token punctuation\">,</span> mytimestamp <span class=\"token keyword\">FROM</span> type_test<span class=\"token punctuation\">;</span>\n<span class=\"token comment\"># +-------------------------------------------+</span>\n<span class=\"token comment\"># |      mydatetime     |      mytimestamp    |</span>\n<span class=\"token comment\"># |-------------------------------------------|</span>\n<span class=\"token comment\"># | 2020-03-20 03:30:58 | 2020-03-19 19:30:58 |</span>\n<span class=\"token comment\"># +-------------------------------------------+</span></code></pre></div>\n<br/>\n&nbsp;&nbsp;삽입 시점의 데이터베이스의 시간대는 KST으로, 오프셋은 '+9'이다. 시간대를 변경하기 전 조회 시점의 경우, 동일한 시간대, 동일한 오프셋이기 때문에 두 형식 모두 '2020-03-20 03:30:58'을 출력하는 것을 볼 수 있다. TIMESTAMP는 삽입 시점의 오프셋인 '+9'를 고려한 '2020-03-19 18:30:58'UTC 을 저장해두었다. 이후, 조회 시점의 오프셋 또한 '+9'로 동일하기 때문에 DATETIME과 동일한 '2020-03-20 03:30:58'을 반환한다. 하지만 시간대가 변경되고 난 후 TIMESTAMP 형식의 결과는 조회 시점의 시간대를 반영하기 때문에 '2020-03-19 18:30:58'UTC에 조회 시점의 오프셋인 '+1'을 연산한 '2020-03-19 19:30:58'을 반환하게 된다.  \n</li>\n</ol>\n</br>\n<h3 id=\"2-표현-범위의-차이\" style=\"position:relative;\"><a href=\"#2-%ED%91%9C%ED%98%84-%EB%B2%94%EC%9C%84%EC%9D%98-%EC%B0%A8%EC%9D%B4\" aria-label=\"2 표현 범위의 차이 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. 표현 범위의 차이</h3>\n<p>  두 번째 차이점인 표현 범위의 차이는 저장 방식의 차이이기도 한데, <strong>TIMESTAMP는 UTC 시간으로 변환하여 저장할 때, 유닉스 시간으로 저장한다.</strong>   </p>\n<p><strong><em>'유닉스 시간이란, UTC 시간의 시작시간인 '1970-01-01 00:00:00'UTC 로부터의 경과 시간을 UTC 초를 나타내는 4 바이트 정수를 의미한다.'</em></strong></p>\n<p>  TIMESTAMP는 단순히 '2020-03-20 03:30:58'을 UTC 시간으로 변환한 '2020-03-19 18:30:58'UTC를 저장하는 것이 아닌, <strong>'1970-01-01 00:00:00'UTC 부터 '2020-03-19 18:30:58'UTC 까지의 초 수인 <span class=\"katex\"><span class=\"katex-mathml\"><math><semantics><mrow><mn>1</mn><mo separator=\"true\">,</mo><mn>584</mn><mo separator=\"true\">,</mo><mn>610</mn><mo separator=\"true\">,</mo><mn>258</mn></mrow><annotation encoding=\"application/x-tex\">1,584,610,258</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.8388800000000001em;vertical-align:-0.19444em;\"></span><span class=\"mord\">1</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.16666666666666666em;\"></span><span class=\"mord\">5</span><span class=\"mord\">8</span><span class=\"mord\">4</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.16666666666666666em;\"></span><span class=\"mord\">6</span><span class=\"mord\">1</span><span class=\"mord\">0</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.16666666666666666em;\"></span><span class=\"mord\">2</span><span class=\"mord\">5</span><span class=\"mord\">8</span></span></span></span> 을 저장한다.</strong> 이러한 저장방식은 아래의 특징들과 같은 표현 범위의 차이를 만든다.</p>\n<ul>\n<li>\n<p><strong>유닉스 시간으로 저장되는 TIMESTAMP는 시작 시간인 '1970-01-01 00:00:00'UTC 에서부터만 표현이 가능하다.</strong><br>\n   UNIX_TIMESTAMP() 함수를 통해 유닉스 시간으로 변환해볼 수 있는데, '1970-01-01 00:00:00'UTC 이전의 날짜를 변환하면 모두 0의 값을 가진다.   </p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">// 0</span>\n<span class=\"token keyword\">SELECT</span> UNIX_TIMESTAMP<span class=\"token punctuation\">(</span><span class=\"token string\">'1970-01-01 00:00:00'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> \n\n<span class=\"token comment\">// 1584610258</span>\n<span class=\"token keyword\">SELECT</span> UNIX_TIMESTAMP<span class=\"token punctuation\">(</span><span class=\"token string\">'2020-03-20 03:30:58'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// 0</span>\n<span class=\"token keyword\">SELECT</span> UNIX_TIMESTAMP<span class=\"token punctuation\">(</span><span class=\"token string\">'1945-08-15 00:00:00'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> </code></pre></div>\n</br>\n</li>\n<li>\n<p><strong>TIMESTAMP는 4바이트 정수라는 한계로 인해 <span class=\"katex\"><span class=\"katex-mathml\"><math><semantics><mrow><mn>2</mn><mo separator=\"true\">,</mo><mn>147</mn><mo separator=\"true\">,</mo><mn>483</mn><mo separator=\"true\">,</mo><mn>647</mn><mo stretchy=\"false\">(</mo><msup><mn>2</mn><mn>31</mn></msup><mo>−</mo><mn>1</mn><mo stretchy=\"false\">)</mo></mrow><annotation encoding=\"application/x-tex\">2,147,483,647(2^{31}- 1)</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:1.064108em;vertical-align:-0.25em;\"></span><span class=\"mord\">2</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.16666666666666666em;\"></span><span class=\"mord\">1</span><span class=\"mord\">4</span><span class=\"mord\">7</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.16666666666666666em;\"></span><span class=\"mord\">4</span><span class=\"mord\">8</span><span class=\"mord\">3</span><span class=\"mpunct\">,</span><span class=\"mspace\" style=\"margin-right:0.16666666666666666em;\"></span><span class=\"mord\">6</span><span class=\"mord\">4</span><span class=\"mord\">7</span><span class=\"mopen\">(</span><span class=\"mord\"><span class=\"mord\">2</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.8141079999999999em;\"><span style=\"top:-3.063em;margin-right:0.05em;\"><span class=\"pstrut\" style=\"height:2.7em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\">3</span><span class=\"mord mtight\">1</span></span></span></span></span></span></span></span></span><span class=\"mspace\" style=\"margin-right:0.2222222222222222em;\"></span><span class=\"mbin\">−</span><span class=\"mspace\" style=\"margin-right:0.2222222222222222em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1em;vertical-align:-0.25em;\"></span><span class=\"mord\">1</span><span class=\"mclose\">)</span></span></span></span> 초까지만 표현이 가능하다.</strong>  (이를 'Y2K38', <a href=\"https://ko.wikipedia.org/wiki/2038%EB%85%84_%EB%AC%B8%EC%A0%9C\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">2038년 문제</a>라고 한다.)<br>\n   실제로 유닉스 시간을 지역 시간으로 변환하는 함수인 <code class=\"language-text\">FROM_UNIXTIME()</code>으로 계산을 해보면 '2038-01-19 03:14:07'UTC, 한국 시각으로는 '2038-01-19 12:14:07'까지만 표현이 가능한 것을 확인할 수 있다. 표현 범위의 한계를 넘어선 2,147,483,648초를 변환해보면 NULL이 반환된다.  </p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\">// '2038-01-19 12:14:07', '2038-01-19 03:14:07'UTC</span>\n<span class=\"token keyword\">SELECT</span> FROM_UNIXTIME<span class=\"token punctuation\">(</span><span class=\"token number\">2147483647</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'%Y-%m-%d %h:%i:%s'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// NULL</span>\n<span class=\"token keyword\">SELECT</span> FROM_UNIXTIME<span class=\"token punctuation\">(</span><span class=\"token number\">2147483648</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'%Y-%m-%d %h:%i:%s'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n</br>\n</li>\n</ul>\n<p>  DATETIME, TIMESTAMP의 표현 범위 차이를 정리하면,    </p>\n<ul>\n<li><strong>DATETIME은     ['0000-01-01 00:00:00', '9999-12-31 23:58:59']</strong></li>\n<li><strong>TIMESTAMP는 ['1970-01-01 00:00:00', '2038-01-19 03:14:07']</strong>  </li>\n</ul>\n<p>  하지만 UTC 시간을 따르는 TIMESTAMP는 시간대에 따라, 명시한 오프셋에 따라 그 범위가 다르다.<br>\n또한 날짜 및 시간 데이터를 저장할 때는 표현 범위 밖의 데이터는 저장되지 않는다. 아래의 예제로 확인해보자.</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token comment\"># Data truncation: Incorrect datetime value: '1970-01-01 00:00:01' for column</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytimestamp<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'1970-01-01 00:00:00'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># Data truncation: Incorrect datetime value: '1970-01-01 09:00:00' for column</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytimestamp<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'1970-01-01 09:00:00'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># OK! '1970-01-01 09:00:01'</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytimestamp<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'1970-01-01 09:00:01'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># OK! '2020-03-20 11:30:58'</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytimestamp<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2038-01-19 12:14:08+01:00'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># OK! '2038-01-19 12:14:07'</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytimestamp<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2038-01-19 12:14:07'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\"># Data truncation: Incorrect datetime value: '2038-01-19 12:14:08'</span>\n<span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> <span class=\"token punctuation\">`</span>type_test<span class=\"token punctuation\">`</span> <span class=\"token punctuation\">(</span>mytimestamp<span class=\"token punctuation\">)</span> <span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'2038-01-19 12:14:08'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>  예제와 같이 <strong>한국의 시간대를 사용하여 삽입할 때, 표현 범위는 지역의 오프셋을 고려한 범위인 ['1970-01-01 09:00:01', '2038-01-19 12:14:07']이 된다.</strong> 또한 오프셋을 명시한 '2038-01-19 12:14:08+01:00'도 가능한데, 위의 설명과 동일하기 때문에 '2020-03-20 11:30:58'의 값을 가지는 이유에 대해서는 스스로 이해해보자.</p>\n</br>\n</br>\n<h1 id=\"결론\" style=\"position:relative;\"><a href=\"#%EA%B2%B0%EB%A1%A0\" aria-label=\"결론 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>결론</h1>\n<h2 id=\"datetime-vs-timestamp\" style=\"position:relative;\"><a href=\"#datetime-vs-timestamp\" aria-label=\"datetime vs timestamp permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>DATETIME vs TIMESTAMP</h2>\n<hr>\n<p>  두 형식을 정리해보자면, </p>\n<ul>\n<li>두 형식에 사용 가능한 문자열의 형식은 동일하며, 지역 지정자 'Z'가 추가된 문자열은 사용이 불가능하다.</li>\n<li>DATETIME은 <strong>UTC를 고려하지 않고 지역 시간으로 저장</strong>한다.</li>\n<li>TIMESTAMP는 <strong>UTC를 반영하여 내부적으로 UTC 시간으로 저장해두고 조회 시에 지역 시간으로 변환한다.</strong> 이를 통해 조회하는 지역마다 동일한 UTC 시간을 의미할 수 있도록 다르게 표현한다.</li>\n</ul>\n<p><span class='small-text'>** 년도 정보를 저장하는 YEAR 형식도 존재한다. 자세히 다루지 않고 <a href=\"https://dev.mysql.com/doc/refman/8.0/en/year.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">링크</a>로 대체한다.</span>\n</br></p>\n<h2 id=\"iso-8601-형식에-맞는-저장-형식은\" style=\"position:relative;\"><a href=\"#iso-8601-%ED%98%95%EC%8B%9D%EC%97%90-%EB%A7%9E%EB%8A%94-%EC%A0%80%EC%9E%A5-%ED%98%95%EC%8B%9D%EC%9D%80\" aria-label=\"iso 8601 형식에 맞는 저장 형식은 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ISO 8601 형식에 맞는 저장 형식은?</h2>\n<hr>\n<p>  지금까지 MySQL에서 날짜 및 시간 데이터를 저장하는 형식에 대해 알아보았다. ISO 8601 형식의 데이터를 어떤 형식으로 저장해야할까? 날짜 데이터를 저장하는 DATE, 시간 데이터를 저장하는 TIME 두 형식 모두 날짜와 시간 데이터의 부분적인 정보만을 담을 수 있기 때문에 DATETIME, TIMESTAMP가 ISO 8601 형식의 데이터를 저장하는 데 적합하다고 볼 수 있다. ISO 8601 형식의 두 가지 경우에 따라 적합한 저장 방식과 전략을 설정해야 한다.</p>\n<h3 id=\"yyyy-mm-ddthhmmssz-형식의-utc-시간을-사용하는-경우\" style=\"position:relative;\"><a href=\"#yyyy-mm-ddthhmmssz-%ED%98%95%EC%8B%9D%EC%9D%98-utc-%EC%8B%9C%EA%B0%84%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B2%BD%EC%9A%B0\" aria-label=\"yyyy mm ddthhmmssz 형식의 utc 시간을 사용하는 경우 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>'YYYY-MM-DDThh:mm:ssZ' 형식의 UTC 시간을 사용하는 경우,</h3>\n<p>  먼저 지역 지정자 'Z'가 추가된 문자열은 사용이 불가능하므로 제거하는 전처리가 필요하다.   </p>\n<ol>\n<li>DATETIME 형식으로 저장하게 되면 UTC 시간을 고려하지 않기 때문에 UTC 시간의 의미를 그대로 저장할 수 있으므로 <strong>UTC 시간을 저장하길 원한다면 해당 형식을 사용하자.</strong><br>\n</br>  </li>\n<li>TIMESTAMP에 저장하게 되면 해당 시간이 UTC 시간임에도 불구하고 지역 시간대를 고려한 UTC 시간으로 변환하는 작업을 거친 뒤, 저장되게 된다.<del>(UTC 시간의 UTC 시간화..)</del><br>\n   물론 삽입과 조회 시점의 시간대가 동일한 경우, 저장한 시간의 값은 동일할 수 있으나 UTC 시간의 의미가 사라지게 된다. 또한 시간대가 변경되면 해당 시간대의 오프셋으로 계산되기 때문에 값이 변경될 수 있다. 그러므로 <strong>TIMESTAMP를 사용하기 위해서는 '+00:00'으로 오프셋을 명시하여 UTC 시간으로 저장될 수 있도록 하자.</strong> </li>\n</ol>\n</br>\n<h3 id=\"yyyy-mm-ddthhmmss-형식의-지역-시간을-사용하는-경우\" style=\"position:relative;\"><a href=\"#yyyy-mm-ddthhmmss-%ED%98%95%EC%8B%9D%EC%9D%98-%EC%A7%80%EC%97%AD-%EC%8B%9C%EA%B0%84%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B2%BD%EC%9A%B0\" aria-label=\"yyyy mm ddthhmmss 형식의 지역 시간을 사용하는 경우 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>'YYYY-MM-DDThh:mm:ss' 형식의 지역 시간을 사용하는 경우,</h3>\n<ol>\n<li>DATETIME 형식으로 저장하게 되면 UTC 시간을 고려하지 않기 때문에 지역 시간의 의미를 그대로 저장할 수 있으므로 <strong>지역 시간을 저장하길 원한다면 해당 형식을 사용하자.</strong><br>\n</br>  </li>\n<li>TIMESTAMP에 저장하게 되면 지역 시간대를 고려한 UTC 시간으로 변환하여 저장하기 때문에 조회하는 지역 시간대를 고려한 지역 시간대를 전달할 수 있다. <strong>하지만 저장하고자 하는 지역 시간의 시간대와 데이터베이스의 시간대가 동일해야 올바른 시간을 전달할 수 있을 것이다.</strong></li>\n</ol>\n</br>\n</br>\n<h2 id=\"참고자료\" style=\"position:relative;\"><a href=\"#%EC%B0%B8%EA%B3%A0%EC%9E%90%EB%A3%8C\" aria-label=\"참고자료 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>참고자료</h2>\n<hr>\n<p>각 형식별 문자열 형식 <a href=\"https://dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://dev.mysql.com/doc/date-and-time-literals.html</a></p>\n<p>각 형식별 내부 저장 구조 <a href=\"https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://dev.mysql.com/doc/date-and-time-data-type-representation.html</a></p>\n<p></br></br></br></p>","excerpt":"지난 포스팅을 통해 JS에서 날짜 및 시간 데이터를 전달할 문자열은 ISO 8601 형식에 맞춰 사용하기로 하였다. 이제 이 문자열을 데이터베이스에 저장하고자 한다. 하지만 MySQL에서 사용할 수 있는 날짜 및 시간 데이터의 저장 형식은 5가지나 …","tableOfContents":"<ul>\n<li>\n<p><a href=\"/date-02/#mysql%EC%9D%98-%EB%82%A0%EC%A7%9C-%EB%B0%8F-%EC%8B%9C%EA%B0%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%98%95%EC%8B%9D-data-type\">MySQL의 날짜 및 시간 데이터 형식 (Data Type)</a></p>\n<ul>\n<li><a href=\"/date-02/#%EC%98%88%EC%A0%9C%ED%99%98%EA%B2%BD\">예제환경</a></li>\n<li>\n<p><a href=\"/date-02/#date\">DATE</a></p>\n<ul>\n<li><a href=\"/date-02/#1-yyyy-mm-dd-%EC%9D%98-%ED%98%95%EC%8B%9D\">1. 'YYYY-MM-DD' 의 형식</a></li>\n<li><a href=\"/date-02/#2-%EA%B5%AC%EB%B6%84%EC%9E%90%EA%B0%80-%EC%83%9D%EB%9E%B5%EB%90%9C-yyyymmdd-%ED%98%95%EC%8B%9D\">2. 구분자가 생략된 'YYYYMMDD' 형식</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/date-02/#time\">TIME</a></p>\n<ul>\n<li><a href=\"/date-02/#1-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EC%8B%9C%EB%B6%84%EC%B4%88%EB%A1%9C-%EA%B5%AC%EC%84%B1%EB%90%9C-hhmmss-%ED%98%95%EC%8B%9D\">1. 기본적인 시,분,초로 구성된 'hh:mm:ss' 형식</a></li>\n<li><a href=\"/date-02/#2-%EA%B5%AC%EB%B6%84%EC%9E%90%EA%B0%80-%EC%A1%B4%EC%9E%AC%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-hhmmss-%ED%98%95%EC%8B%9D\">2. 구분자가 존재하지 않는 'hhmmss' 형식</a></li>\n</ul>\n</li>\n<li><a href=\"/date-02/#datetime\">DATETIME</a></li>\n<li>\n<p><a href=\"/date-02/#timestamp\">TIMESTAMP</a></p>\n<ul>\n<li><a href=\"/date-02/#1-%EC%8B%9C%EA%B0%84-%EC%9D%98%EB%AF%B8%EC%9D%98-%EC%B0%A8%EC%9D%B4\">1. 시간 의미의 차이</a></li>\n<li><a href=\"/date-02/#2-%ED%91%9C%ED%98%84-%EB%B2%94%EC%9C%84%EC%9D%98-%EC%B0%A8%EC%9D%B4\">2. 표현 범위의 차이</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p><a href=\"/date-02/#%EA%B2%B0%EB%A1%A0\">결론</a></p>\n<ul>\n<li><a href=\"/date-02/#datetime-vs-timestamp\">DATETIME vs TIMESTAMP</a></li>\n<li>\n<p><a href=\"/date-02/#iso-8601-%ED%98%95%EC%8B%9D%EC%97%90-%EB%A7%9E%EB%8A%94-%EC%A0%80%EC%9E%A5-%ED%98%95%EC%8B%9D%EC%9D%80\">ISO 8601 형식에 맞는 저장 형식은?</a></p>\n<ul>\n<li><a href=\"/date-02/#yyyy-mm-ddthhmmssz-%ED%98%95%EC%8B%9D%EC%9D%98-utc-%EC%8B%9C%EA%B0%84%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B2%BD%EC%9A%B0\">'YYYY-MM-DDThh:mm:ssZ' 형식의 UTC 시간을 사용하는 경우,</a></li>\n<li><a href=\"/date-02/#yyyy-mm-ddthhmmss-%ED%98%95%EC%8B%9D%EC%9D%98-%EC%A7%80%EC%97%AD-%EC%8B%9C%EA%B0%84%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B2%BD%EC%9A%B0\">'YYYY-MM-DDThh:mm:ss' 형식의 지역 시간을 사용하는 경우,</a></li>\n</ul>\n</li>\n<li><a href=\"/date-02/#%EC%B0%B8%EA%B3%A0%EC%9E%90%EB%A3%8C\">참고자료</a></li>\n</ul>\n</li>\n</ul>","fields":{"slug":"/date-02/"},"frontmatter":{"title":"MySQL에서 날짜 및 시간 문자열 저장하기","date":"Jul 06, 2021","tags":["DB","DATE"],"keywords":["무지성 개발 탈출기","Chanuuuu"],"update":"Jan 01, 0001"}}},"pageContext":{"slug":"/date-02/","series":[],"lastmod":"2021-07-06"}},"staticQueryHashes":["2027115977","694178885"]}